package com.zyl.lock;


/**
 * @author zhaoyl
 * @date 2024/5/20 21:51
 * @description 说明
 *
 * 公平锁/非公平锁
 * 公平锁是指多个线程按照申请锁的顺序来获取锁。
 * 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序，有可能后申请的线程比先申请的线程优先获取锁。有可能，会造成优先级反转或者饥饿现象。
 * 对于Java ReentrantLock而言，通过构造函数指定该锁是否是公平锁，默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。
 * 对于Synchronized而言，也是一种非公平锁。由于其并不像ReentrantLock是通过AQS的来实现线程调度，所以并没有任何办法使其变成公平锁。
 *
 * 可重入锁
 * 可重入锁又名递归锁，是指在同一个线程在外层方法获取锁的时候，在进入内层方法会自动获取锁。说的有点抽象，下面会有一个代码的示例。
 * 对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁，其名字是Re entrant Lock重新进入锁。
 * 对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。
 */
public class Demo01 {
    public static void main(String[] args) {
        Phone  phone = new Phone();
        new Thread(()->{
            phone.sms();
        },"线程A").start();
        new Thread(()->{
            phone.sms();
        },"线程B").start();
    }
}
class Phone {
    //加锁：可重入锁
    public synchronized  void sms(){
        System.out.println(Thread.currentThread().getName()+"=>sms");
        //如果不是可重入锁的话，call()可能不会被当前线程执行，可能造成死锁。
        call();//这里也有锁（自动获取）
    }
    public synchronized  void call(){
        System.out.println(Thread.currentThread().getName()+"=>call");
    }
}
/*
        线程A=>sms
        线程A-=call
        线程B=>sms
        线程B-=call*/
